package com.rockfalldefence.sw.embark.client.page;

import net.binarymuse.gwt.client.ui.wizard.WizardPage;

import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.rockfalldefence.sw.embark.client.RDEmbarkContext;

public class CoefficientiTraiettorie extends WizardPage<RDEmbarkContext> {
	public static final PageID PAGEID = new PageID();
	private FlowPanel panel;
	private ListBox dropTopografiche;
	private ListBox dropDimensioni;
	private ListBox dropSimulazioni;
	private TextBox tbEp;
	private TextBox tbHp;
	private TextBox tbVt;
	private TextBox tbMt;
	private TextBox tbHt;

	
	@Override
	public void beforeShow() {
		// TODO Auto-generated method stub
		super.beforeShow();
		computeEp();
		computeHp();
	}

	public CoefficientiTraiettorie() {
		panel = new FlowPanel();
	    panel.add(new HTML("<h1>Energia ed altezza di progetto secondo NTC2008</h1>"));
	    
	    FlexTable t = new FlexTable();
	    t.setHTML(0, 0, "&nbsp;");
	    
	    t.setHTML(5, 2, "&nbsp;");
	    Label lb = new Label("Discretizzazione pendio");
	    lb.setTitle("Qualità della discretizzazione del pendio");
	    t.setWidget(1, 0, lb);
	    lb = new Label("[γDp]");
	    lb.setTitle("Qualità della discretizzazione del pendio");
	    t.setWidget(1, 2, lb);
	    ListBox dropBox = new ListBox(false);
	    dropBox.addChangeHandler(new ChangeHandler() {
			@Override
			public void onChange(ChangeEvent event) {
				computeEp();
				computeHp();
			}
		});
	    dropBox.addItem("1.05 - buona precisione","1.05");
	    dropBox.addItem("1.10 - precisione medio bassa","1.10");
	    dropBox.setTitle("Qualità della discretizzazione del pendio");
	    dropTopografiche = dropBox;
	    t.setWidget(1, 1, dropTopografiche);
	    	    
	    lb = new Label("Rilievo volumetrico");
	    lb.setTitle("Qualità del rilievo volumetrico del blocco di progetto");
	    t.setWidget(2, 0, lb);
	    lb = new Label("[γVol]");
	    lb.setTitle("Qualità del rilievo volumetrico del blocco di progetto");
	    t.setWidget(2, 2, lb);
	    dropBox = new ListBox(false);
	    dropBox.addChangeHandler(new ChangeHandler() {
			@Override
			public void onChange(ChangeEvent event) {
				computeEp();
				computeHp();
			}
		});
	    dropBox.addItem("1.05 - direttamente in parete","1.05");
	    dropBox.addItem("1.10 - rilevi meno precisi","1.10");
	    dropBox.setTitle("Qualità del rilievo volumetrico del blocco di progetto");
	    dropDimensioni = dropBox;
	    t.setWidget(2, 1, dropDimensioni);
	    
	    lb = new Label("Simulazioni caduta massi");
	    lb.setTitle("Attendibilità delle simulazioni di caduta massi");
	    t.setWidget(3, 0, lb);
	    lb = new Label("[γTr]");
	    lb.setTitle("Attendibilità delle simulazioni di caduta massi");
	    t.setWidget(3, 2, lb);
	    dropBox = new ListBox(false);
	    dropBox.addChangeHandler(new ChangeHandler() {
			@Override
			public void onChange(ChangeEvent event) {
				computeEp();
				computeHp();
			}
		});
	    dropBox.addItem("1.02 - sim. con backanalysis", "1.02");
	    dropBox.addItem("1.05 - sim. meno accurate", "1.05");
	    dropBox.setTitle("Attendibilità delle simulazioni di caduta massi");
	    dropSimulazioni = dropBox;
	    t.setWidget(3, 1, dropSimulazioni);
	    
	    lb = new Label("Energia di progetto (kJ)");
	    lb.setTitle("Energia di progetto in kJ");	    
	    tbEp = new TextBox();
	    tbEp.setWidth("80px");
	    tbEp.setReadOnly(true);
	    tbEp.setName("energia");
	    tbEp.setTitle("Energia di progetto in kJ");
	    t.setWidget(9, 0, lb);
	    t.setWidget(9, 1, tbEp);
	    lb = new Label("[1/2*Mt*γVol*(Vt*γTr*γDp)^2]");
	    t.setWidget(9, 2, lb);
	    
	    lb = new Label("Altezza di progetto (m)");
	    lb.setTitle("Altezza di progetto in m");	    
	    tbHp = new TextBox();
	    tbHp.setWidth("80px");
	    tbHp.setReadOnly(true);
	    tbHp.setName("altezza");
	    tbHp.setTitle("Altezza di progetto in m");
	    t.setWidget(8, 0, lb);
	    t.setWidget(8, 1, tbHp);
	    lb = new Label("[Ht*γTr*γDp + ρt]");
	    t.setWidget(8, 2, lb);
	    
	    
	    lb = new Label("Altezza di intercettazione (m)");
	    lb.setTitle("Altezza di intercettazione in m");	    
	    TextBox tb = new TextBox();
	    tb.setWidth("80px");
	    tb.setReadOnly(true);
	    tb.setName("altezzainter");
	    tb.setTitle("H intercettazione in m");
	    t.setWidget(5, 0, lb);
	    tbHt = tb;
	    t.setWidget(5, 1, tbHt);
	    lb = new Label("[Ht]");
	    t.setWidget(5, 2, lb);
	    
	    lb = new Label("Massa del blocco (kg)");
	    lb.setTitle("Massa del blocco (kg)");	    
	    tb = new TextBox();
	    tb.setWidth("80px");
	    tb.setReadOnly(true);
	    tb.setName("massa");
	    tb.setTitle("Massa del blocco (kg)");
	    t.setWidget(6, 0, lb);
	    tbMt = tb;
	    t.setWidget(6,1, tbMt);
	    lb = new Label("[Mt]");
	    t.setWidget(6, 2, lb);
	    
	    lb = new Label("Velocità del blocco (m/s)");
	    lb.setTitle("Velocità del blocco (m/s)");	    
	    tb = new TextBox();
	    tb.setWidth("80px");
	    tb.setReadOnly(true);
	    tb.setName("vel");
	    tb.setTitle("Velocità del blocco (m/s)");
	    t.setWidget(7, 0, lb);
	    tbVt = tb;
	    t.setWidget(7,1, tbVt);
	    lb = new Label("[Vt]");
	    t.setWidget(7, 2, lb);
	    
	    
	    panel.add(t);
	    
	}

	protected boolean onlynumbers(KeyPressEvent event)
	{

		char inputC = event.getCharCode();
		Character chr = new Character(inputC);
		if (Character.isLetter(inputC)) {
			((TextBox) event.getSource()).cancelKey();
		} else if (chr.compareTo(new Character(','))==0) {
			((TextBox) event.getSource()).cancelKey();
		}
		return true;
	}
	
	private void computeEp()
	{
		String sGammaDp = dropTopografiche.getValue(dropTopografiche.getSelectedIndex());
		double dgammaDp = Double.parseDouble(sGammaDp);
		String sGammaVol = dropDimensioni.getValue(dropDimensioni.getSelectedIndex());
		double dgammaVol = Double.parseDouble(sGammaVol);
		String sGammaTr = dropSimulazioni.getValue(dropSimulazioni.getSelectedIndex());
		double dgammaTr = Double.parseDouble(sGammaTr);
		String sVt = getContext().getVt();
		tbVt.setText(sVt);
		double dvt = Double.parseDouble(sVt);
		String sMt = getContext().getMt();
		tbMt.setText(sMt);
		double dmt = Double.parseDouble(sMt);
		double energy = 0.5*dmt*dgammaVol*Math.pow(dvt*dgammaTr*dgammaDp,2.0);
		energy = energy/1000.0;
		getContext().setEp(Double.toString(energy));
		long x=(long)(energy*100);
		tbEp.setText(Double.toString(((double)x/100)));
	}

	private void computeHp()
	{
		String sGammaDp = dropTopografiche.getValue(dropTopografiche.getSelectedIndex());
		double dgammaDp = Double.parseDouble(sGammaDp);
		String sGammaTr = dropSimulazioni.getValue(dropSimulazioni.getSelectedIndex());
		double dgammaTr = Double.parseDouble(sGammaTr);
		String sHt = getContext().getHt();
		tbHt.setText(sHt);
		double dht = Double.parseDouble(sHt);
		String sPhit = getContext().getPhit();
		double dPhit = Double.parseDouble(sPhit);
		double dHp = dht*dgammaTr*dgammaDp + dPhit;
		getContext().setHp((Double.toString(dHp)));
		long x=(long)(dHp*100);
		tbHp.setText(Double.toString(((double)x/100)));
	}

	@Override
	public Widget asWidget() {
		
		return panel;
	}

	@Override
	public PageID getPageID() {
		return PAGEID;
	}

	@Override
	public String getTitle() {
		return "Energia di progetto";
	}

}
